/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function (nums) {
  const visited = {};
  const permuteUnique = [];
  nums.sort();
  const backTrace = (arr, j) => {
    if (j === nums.length) {
      permuteUnique.push([...arr]);
      return;
    }
    for (let i = 0; i < nums.length; i++) {
      // 处理回溯条件
      // 注意：这里是看上一个节点有没有被访问过
      if (visited[i] || (nums[i] === nums[i - 1] && !visited[i - 1])) {
        // 这里还有一些动作 这里只是不回溯
        continue;
      }
      arr.push(nums[i]);
      visited[i] = true;
      // 回溯
      backTrace(arr, j + 1);
      visited[i] = false;
      arr.pop();
    }
  };
  backTrace([], 0);
  return permuteUnique;
};
